在 Unstructured Data 中計算效能變得格外重要,而計算效能不外乎是平行化, 分散式 和 Caching 三大方向,當然也會針對演算法去做優化,像是 vLLM 這個項目就提出特殊的 Aggregator 架構來優化 Batch Inference 場景,另外也有 LightSeq, OpenNMT 等項目也是偏向針對演算法特定場景做優化
但我們今天先討論平行化跟分散式,平行化在 CPU 最常聽到的就是 SIMP 而在 GPU 基本上就是 CUDA Toolkit 的天和,然而當有多個 request 同時而來是 一個具有 AutoScaling 的分散式系統才能更好的處理這樣大量的需求,常見的做法有幾個
- Cloud Infro Provider 內建的 Auto Scaling: 優點是這樣的服務通常不會只包含 Inference 而是提供體整個 MLOps 相對應的元件,然而缺點就是會被綁定在平台,另外一些高階晶片像是 A100 可能會有供不應求的情快
- Serverless GPU: 最近很紅的如 RunPod, Banana 等,使用的 GPU 基本上是按秒計費,在很多場景下相對可以控制成本,並且會根據使用量可以自動 Horizontal Scaling,缺點就是在大多情況還是會遇到 Cold Start delay,
- 當然還是可以自己透過 Kubernetes 來做到,一個常見的組合就是透過 Triton Inference Server 加上 KServer,也有一派希望逃離 NVidia 控制的可以參考 Cog,缺點就是在整個開發過程,包括 Scaling 的Strategy和 Kubernetes 管理有很高的技術難度
- 有些成熟的工具如 Seldon Core 和 BentoML 則是瞄準第三個做法的痛點,提供一個已經寫好策略和包裝好的 Kubernetes 部署方式,並將產品開源來讓你輕鬆部署,而他們的商業策略則是經營一個商業版本,需要收費來使用一些進階功能或是部署協助
原本在 Binary Classification 透過 FastAPI 或是 Flask 等方式去建構一個 Python API Backend,到 Unstructured Data 題目時,可能會需要更多運算的處理,甚至需要透過 gRPC 來解決 IO latency 的問題